package com.leetroll.common.utils;

import com.google.gson.internal.LinkedTreeMap;
import lombok.extern.slf4j.Slf4j;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.List;
import java.util.Map;

@Slf4j
public class BaiduTranslateUtil {
    // 百度翻译官方api
    private static final String URL = "http://api.fanyi.baidu.com/api/trans/vip/translate";
    // APP ID (百度翻译控制台)
    private static final String APPID = "20240114001940644";
    // 密钥
    private static final String KEY = "Ngsm2hVaqwAnpwfPHCzr";

    private static final char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    /**
     * 翻译文本
     * ** 如果报错, 可能是跑翻译的这台机器的公网ip没有加入百度翻译管理控制台, 请联系@elle加
     * @param text 待翻译的文本
     */
    public static String translate(String text) {
        if (text.isEmpty()) return "";
        String dst = null;

        // 随机数，官方提供的是获取时间
        String SALT = Long.toString(System.currentTimeMillis());
        // 对签名做md5加密
        String SIGN = md5(APPID + text + SALT + KEY);

        // 组装查询地址  // 添加参数，并对参数的值进行urlEncode utf-8编码
        StringBuilder requestUrl = new StringBuilder(URL);
        requestUrl.append("?");
        requestUrl.append("q");
        requestUrl.append("=");
        requestUrl.append(urlEncodeUTF8(text));
        requestUrl.append("&");
        requestUrl.append("from");
        requestUrl.append("=");
        requestUrl.append(urlEncodeUTF8("auto"));
        requestUrl.append("&");
        requestUrl.append("to");
        requestUrl.append("=");
        requestUrl.append(urlEncodeUTF8("zh"));
        requestUrl.append("&");
        requestUrl.append("appid");
        requestUrl.append("=");
        requestUrl.append(urlEncodeUTF8(APPID));
        requestUrl.append("&");
        requestUrl.append("salt");
        requestUrl.append("=");
        requestUrl.append(urlEncodeUTF8(SALT));
        requestUrl.append("&");
        requestUrl.append("sign");
        requestUrl.append("=");
        requestUrl.append(urlEncodeUTF8(SIGN));

        try {
            // 查询并获取返回结果
            String json = HttpUtil.request(requestUrl.toString());
            Map<String, Object> map = JsonUtils.jsonToMap(json);
            List<LinkedTreeMap<String, String>> transResult = (List<LinkedTreeMap<String, String>>) map.get("trans_result");
            dst = transResult.get(0).get("dst");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return dst;
    }

    /**
     * utf 编码
     */
    public static String urlEncodeUTF8(String source) {
        String result = source;
        try {
            result = URLEncoder.encode(source, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static void main(String[] args) {
        String querySource = "i am pretty";
        String str = translate(querySource);
        System.out.println("翻译结果: " + str);
    }

    /**
     * 获得一个字符串的MD5值
     */
    public static String md5(String input) {
        if (input == null)
            return null;

        try {
            // 拿到一个MD5转换器（如果想要SHA1参数换成”SHA1”）
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            // 输入的字符串转换成字节数组
            byte[] inputByteArray = input.getBytes(StandardCharsets.UTF_8);
            // inputByteArray是输入字符串转换得到的字节数组
            messageDigest.update(inputByteArray);
            // 转换并返回结果，也是字节数组，包含16个元素
            byte[] resultByteArray = messageDigest.digest();
            // 字符数组转换成字符串返回
            return byteArrayToHex(resultByteArray);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private static String byteArrayToHex(byte[] byteArray) {
        // new一个字符数组，这个就是用来组成结果字符串的（解释一下：一个byte是八位二进制，也就是2位十六进制字符（2的8次方等于16的2次方））
        char[] resultCharArray = new char[byteArray.length * 2];
        // 遍历字节数组，通过位运算（位运算效率高），转换成字符放到字符数组中去
        int index = 0;
        for (byte b : byteArray) {
            resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
            resultCharArray[index++] = hexDigits[b & 0xf];
        }

        // 字符数组组合成字符串返回
        return new String(resultCharArray);

    }
}
